/** 系统配置 */
import type { AppConfig } from './type'
import { isMatch } from '@/utils/detection'
import { joinUrls } from '@/utils/generate'

// llm-provider 实现类
// @baseon: /src/provider/llm/baseProvider.ts
import BackendProvider from './llmProvider/backend'
import LMStudioProvider from './llmProvider/lm-studio'
import OllamaProvider from './llmProvider/ollama'

const config: AppConfig = {
  title: 'Vue3 Ai Scaffold',
  themeColor: '#1677ff',
  darkThemeColor: '#70c0e8',
  llm: {
    provider: {
      backend: BackendProvider,
      ollama: OllamaProvider,
      'lm-studio': LMStudioProvider,
    },
    suppliers: () => {
      try {
        return JSON.parse(import.meta.env.VITE_LLM_SUPPLIERS)
      } catch (error) {
        window.console.error('Suppliers load error: ', error)
        return []
      }
    },
  },
  env: {
    viteBaseApi: import.meta.env.VITE_BASE_API ?? '/',
    viteUseMock: import.meta.env.VITE_USE_MOCK === 'true',
  },
  service: {
    whiteList: ['/access/refresh-token', '/access/login'],
    api: {
      url: (reqConfig) => {
        // 可自定义mock忽略列表，当mock模式开启的时候生效
        // 通常情况下当后端提供了部分API时可能会用到（用来填充未实现的API）
        // 支持正则表达式
        const ignores: string[] = []

        reqConfig.url = reqConfig.url || ''
        // 如果请求地址中包含http头，直接返回
        if (/^(https?:\/\/|\/\/)/.test(reqConfig.url)) {
          return reqConfig.url
        }
        // 判断是否已忽略
        if (config.env.viteUseMock && !isMatch(ignores, reqConfig.url)) {
          // 返回mock地址（即原地址）
          return reqConfig.url
        }
        // 返回实际服务器地址
        return joinUrls(config.env.viteBaseApi, 'api/app', reqConfig.url)
      },
      response: (res) => {
        if (res) {
          if (!res.data?.success) {
            throw new Error(res.data?.message || '请求未响应，请稍候重试')
          } else {
            return { message: res.data?.message, data: res.data?.data }
          }
        } else {
          return { message: '请求异常，请稍候重试', data: null }
        }
      },
    },
  },
}

export default config
